package firstappdemo.config;

import firstappdemo.domain.User;
import firstappdemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.*;
import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * @author liujs@centaline.com.cn
 * @date 2020/2/12 14:37
 * 路由器配置
 */
@Configuration
public class RouterFuncitonConfiguration {
    /**
     * Servlet
     * 请求接口:ServletRequest
     * 响应接口：ServerResponse
     * 既可支持Servlet规范，也可以支持自定义,比如 Netty(Web Server)
     * 以本例
     * 定义GET请求，并且返回所有的用户对象 URI：/person/find/all
     * Flus是0-N个集合
     * Mono是0-1个集合
     * Reactive中的Flus或Mono是异步处理（非阻塞）
     * 集合对象基本上是同步处理（阻塞）
     * Flus或者Mono都是Publisher
     */
    @Bean
    @Autowired
    public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository) {

        return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
                request -> {
                    //返回所有对象
                    Collection<User> users = userRepository.findAll();
                    Flux<User> userFlux = Flux.fromIterable(users);
                    return ServerResponse.ok().body(userFlux, User.class);
                }
        );
    }
}
